#include <iostream>
#include <cmath>
using namespace std;
#define inf 0x7FFFFFFF
#define M 201
int Map[M][M],Dist[M],visit[M];
int main(){
    int n,m,dls,now,Min,next,target;
    while(cin>>n>>m){
        //初始化
        for(int i=0;i<n;i++){
            visit[i]=1;
            Dist[i]=inf;
            for(int j=0;j<n;j++)
                Map[i][j]=inf;
        }
        while(m--){
            int a,b;
            cin>>a>>b>>dls;
            //这个取min操作可以防止重边，过滤从源点到另一个顶点有不同路径的情况，最后取最小值
            Map[a][b]=min(Map[a][b],dls);
            Map[b][a]=Map[a][b];
        }
        cin>>now>>target;

        
        Dist[now]=0;
        visit[now]=0;
        //不断更新数组，当now==target时就代表已经求出now到target的最短路径
        //若循环不停，将求出以now为起点到各个点的最短路径
        while(now!=target){
            Min=inf;

            //松弛操作
            for(int i=0;i<n;i++){
                if(Map[now][i]!=inf)
                    Dist[i]=min(Dist[i],Dist[now]+Map[now][i]);     //积累一趟趟距离
                if(visit[i]&&Dist[i]<Min){
                    Min=Dist[i];
                    next=i;
                }
            }


            if(Min==inf) break;     //没路了
            now=next;
            visit[now]=0;   //不会回到已经去过的位置
        }
        if(Dist[target]==inf) cout<<-1<<endl;
        else cout<<Dist[target]<<endl;
    }
    return 0;
}

/*
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2


*/